#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define lc (o<<1)
#define rc (o<<1|1)
#define pb push_back
using namespace std;
typedef long long LL;
typedef double db;
inline int read()
{
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9') { if(ch=='-')f=-1; ch=getchar(); }
	while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+ch-'0'; ch=getchar(); }
	return x*f;
}
const int MAXN=2e5+10;
int n,K,f[MAXN],st[MAXN],ed[MAXN],d[MAXN],c[MAXN],s[MAXN],w[MAXN];
vector<int>V[MAXN];
struct Seg_T
{
	int minv[MAXN<<2],addv[MAXN<<2];
	void push_up(int o)
	{
		minv[o]=min(minv[lc],minv[rc]);
		return;
	}
	void push_down(int o)
	{
		if(!addv[o])return;
		minv[lc]+=addv[o];
		minv[rc]+=addv[o];
		addv[lc]+=addv[o];
		addv[rc]+=addv[o];
		addv[o]=0;
		return;
	}
	void build(int o,int l,int r)
	{
		addv[o]=0;
		if(l==r)return (void)(minv[o]=f[l]);
		int mid=(l+r)>>1;
		build(lc,l,mid);
		build(rc,mid+1,r);
		push_up(o);
		return;
	}
	void update(int o,int l,int r,int yl,int yr,int x)
	{
		if(yl>yr)return;
		if(yl<=l&&r<=yr)return (void)(minv[o]+=x,addv[o]+=x);
		push_down(o);
		int mid=(l+r)>>1;
		if(yl<=mid)update(lc,l,mid,yl,yr,x);
		if(yr>mid)update(rc,mid+1,r,yl,yr,x);
		push_up(o);
		return;
	}
	int query(int o,int l,int r,int yl,int yr)
	{
		if(yl>yr)return 0;
		if(yl<=l&&r<=yr)return minv[o];
		push_down(o);
		int mid=(l+r)>>1,ret=INF;
		if(yl<=mid)ret=query(lc,l,mid,yl,yr);
		if(yr>mid)ret=min(ret,query(rc,mid+1,r,yl,yr));
		return ret;
	}
}T1;
int main()
{
#ifndef ONLINE_JUDGE
	freopen("in.in","r",stdin);
	freopen("out.out","w",stdout);
#endif
	n=read();K=read();
	for(int i=2;i<=n;++i)d[i]=read();
	for(int i=1;i<=n;++i)c[i]=read();
	for(int i=1;i<=n;++i)s[i]=read();
	for(int i=1;i<=n;++i)w[i]=read();
	++n;++K;
	d[n]=INF;w[n]=INF;
	for(int i=1;i<=n;++i)
	{
		int l=d[i]-s[i],r=d[i]+s[i];
		l=lower_bound(d+1,d+1+n,l)-d;
		r=lower_bound(d+1,d+1+n,r)-d;
		if(d[i]+s[i]<d[r])--r;
		st[i]=l;ed[i]=r;
		V[ed[i]].pb(i);
	}
	int ans,tmp=0;
	for(int i=1;i<=n;++i)
	{
		f[i]=tmp+c[i];
		for(int j=0;j<V[i].size();++j)
			tmp+=w[V[i][j]];
	}
	ans=f[n];
	for(int j=2;j<=K;++j)
	{
		T1.build(1,1,n);
		for(int i=1;i<=n;++i)
		{
			f[i]=T1.query(1,1,n,1,i-1)+c[i];
			for(int k=0;k<V[i].size();++k)
				T1.update(1,1,n,1,st[V[i][k]]-1,w[V[i][k]]);
		}
		ans=min(ans,f[n]);
	}
	printf("%d\n",ans);
	return 0;
}
